/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CiaAerea;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;


/**
 *
 * @author Andre
 */
public class DestinoSerialize implements Serializable {

    private int codigoIdentificador;
    private String nomeCidade;
    private String nomeAeroporto;
    private int fusoHorario;
    private double distanciaBase;
    
    private Endereco EndDestino;
    private Voo vooDestino;
    
    DestinoSerialize() throws Exception{
             
    }
    
    
    DestinoSerialize(int cod,String Cidade, String Aeroporto, 
            int Fuso, double Distancia, Endereco end) throws Exception{
                EndDestino = end;
             
        setcodigoIdentificador(cod);
        setNomeCidade( Cidade );
        setNomeAeroporto( Aeroporto);
        setFusoHorario( Fuso );
        setDistanciaBase( Distancia );
        
    }

 public void setcodigoIdentificador(int cod) throws Exception{
        
        if(cod==0)
        {
            throw new Exception("Codigo Identificador nulo!");
        }
        else
        {
            this.codigoIdentificador = cod;
        }
        
    }
    
    public void setNomeCidade( String cidade ) throws Exception{
        
        if(cidade.isEmpty())
        {
           throw new Exception("Cidade nula! Digite novamente."); 
        }
        else
        {       for (int i = 0; i < cidade.length(); i++) {
                if (!Character.isLetter(cidade.charAt(i)) && !Character.isSpaceChar(cidade.charAt(i))) {
                    throw new Exception("Caractere Invalido no campo Nome");
                } else {
                    this.nomeCidade = cidade;
                }
        }
        }
        
    }
    
    public void setNomeAeroporto(String aeroporto) throws Exception{
        
        if(aeroporto.isEmpty())
        {
           throw new Exception("Aeroporto nulo! Digite novamente.");  
        }
        else
        {
            for (int i = 0; i < aeroporto.length(); i++) {
                if (!Character.isLetter(aeroporto.charAt(i)) && !Character.isSpaceChar(aeroporto.charAt(i))) {
                    throw new Exception("Caractere Invalido no campo Nome");
                } else {
                    this.nomeAeroporto = aeroporto;
                }
            }
        }
        
    }
    
    public void setFusoHorario(int fuso) throws Exception{
        
        if(fuso< -12 || fuso >12 )
        {
            throw new Exception("Fuso horario Incorreto! Digite novamente.");
        }
        else
        {
            this.fusoHorario = fuso;
        }
        
        
    }
    
    public void setDistanciaBase(double distancia) throws Exception{
        
        if(distancia==0)
        {
           throw new Exception("Distancia nula! Digite novamente.");  
        }
        else
        {
            if(distancia<0){
                            throw new Exception("Distância Incorreta! Digite Novamente!");
            }else{
                    this.distanciaBase = distancia; 
            }
        }
        
        
    }
    
    public void setEnderecoAeroporto(Endereco end){
        EndDestino = end;
    }
    
    public void setVooDestino(Voo voo){
        vooDestino = voo;
    } 
    
    //Funções de GET para a classe Destino 
    public int getcodigoIdentificador(){
        return this.codigoIdentificador;
    }
    
    public String getNomeCidade(){
        return ( this.nomeCidade );
    }
        
    public String getNomeAeroporto(){
        return ( this.nomeAeroporto );
    }
    
    public int getFusoHorario(){
        return ( this.fusoHorario );
    }
        
    public double getDistanciaBase(){
        return ( this.distanciaBase );
    }
    
    public Endereco getEnderecoAeroporto(){
        return ( this.EndDestino );
    }
    
    public String getPais(){
        return ( EndDestino.getPais() );
    }

    public Voo getVooDestino() {
        return vooDestino;
    }
    
    public void escrever(DestinoSerialize dados) throws Exception
    {
        try
        {
            //Verifica se arquivo é existente
            
            File arquivo = new File("destino_"+Integer.toString(dados.getcodigoIdentificador())+".ser");
            if(arquivo.exists()){
                throw new Exception("Arquivo já existente!");
            }
            else{
            ObjectOutputStream saida = new ObjectOutputStream(new FileOutputStream("destino_"+codigoIdentificador+".ser"));
            saida.writeObject(dados);
            saida.close();
            }
            
        }catch(IOException ioException)
        {
            throw new Exception("Erro ao serializar");
        }
    }
    
    public DestinoSerialize ler(String cod) throws Exception
    {
        DestinoSerialize dados = new DestinoSerialize();
        try
        {
            ObjectInputStream entrada = new ObjectInputStream(new FileInputStream("destino_"+cod+".ser"));
             
            dados = (DestinoSerialize) entrada.readObject(); 
            
            
            
            
        }catch(IOException ioException)
        {
            System.err.println(ioException.getMessage());
       
         } catch (ClassNotFoundException ex) {
            Logger.getLogger(DestinoSerialize.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally
        {
           return dados; 
        }
    
    }
    
    public void remover(String cod)
    {
        try
        {
            //FALTA IMPLEMENTAR AINDA
           File file = new File("destino_"+cod+".ser");
           
           if(file.delete())
           {
               JOptionPane.showMessageDialog(null, "Arquivo deletado com sucesso!");
           }
           else
           {
               JOptionPane.showMessageDialog(null, "Problemas ao deletar o arquivo.");
           }
           
            
            
        }catch(Exception e)
        {
            System.err.println(e.getMessage());
        }
    }
    
    public void alterar(DestinoSerialize dados) throws Exception{
        
        try{
        ObjectOutputStream saida = new ObjectOutputStream(new FileOutputStream("destino_"+Integer.toString(dados.getcodigoIdentificador())+".ser"));
        JOptionPane.showMessageDialog(null, "destino_"+Integer.toString(dados.getcodigoIdentificador())+".ser");
        saida.writeObject(dados);
        }catch(Exception e){
            dados.remover(Integer.toString(dados.getcodigoIdentificador()));
            throw new Exception("Erro ao Alterar!");
        }
            
        
    }
}
